#include "stm32f10x.h"
#include "key.h"
#include "beep.h"
#include "led.h"

static void Delay(int time)
{
	while (time--);
}
//void KEY_Config(void)
//{
//	RCC->APB2ENR|=(1<<2)|(1<<6);
//	GPIOA->CRL&=~(0xf);
//	GPIOA->CRL|= (0x4);
//	GPIOE->CRL&=~(0x1c<<8);
//	GPIOE->CRL|= (0x444<<8);
//}
/*
u8 KEY_GET(void)
{
	u8 key=0xff;
	if(!KEY_UP())
	{
		Delay(1000);
		if(!KEY_UP())
		{
			while(!KEY_UP());
			key=1;
		}
	}
	if(!KEY_RIGHT())
	{
		Delay(1000);
		if(!KEY_RIGHT())
		{
			while(!KEY_RIGHT());
			key=2;
		}
	}
	return key;
}*/
#define KEY_STATE_1    1
#define KEY_STATE_2    2
#define KEY_STATE_3    3
u8 KEY_GET(void)
{
	u8 key=0xff;
	static u8 keystate=KEY_STATE_1;
	switch(keystate)
	{
		case KEY_STATE_1:
			if(!KEY_UP()||!KEY_RIGHT()||!KEY_DOWN()||KEY_LEFT())
			{
				keystate=KEY_STATE_2;
			}break;
		case KEY_STATE_2:
			if(!KEY_UP())
			{
				key=1;
				keystate=KEY_STATE_3;
			}
			else if(!KEY_DOWN())
			{
				key=2;
				keystate=KEY_STATE_3;
			}
			else if(!KEY_RIGHT())
			{
				key=3;
				keystate=KEY_STATE_3;
			}
			else if(KEY_LEFT())
			{
				key=4;
				keystate=KEY_STATE_3;
			}
			else
			{
				keystate=KEY_STATE_1;
			}break;
		case KEY_STATE_3:
			if(KEY_UP()&&KEY_RIGHT()&&KEY_DOWN()&&!KEY_LEFT())
			{
				keystate=KEY_STATE_1;
			}
			break;
	}
	return key;
}




void KEY_TEST(void)
{
	static u8 flag1=0,flag2=0,flag3=0,flag4=0;
	u8 key=0xff;
	key=KEY_GET();
	switch(key)
	{
		case up_key:
			flag1=!flag1;LED1(flag1);break;
		case right_key:flag2=!flag2;LED2(flag2);break;
		case down_key:flag3=!flag3;LED3(flag3);break;
		case left_key:flag4=!flag4;LED4(flag4);break;
	}
}



void KEY_Configlib(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
	GPIO_Init(GPIOE,&GPIO_InitStruct);
}

void KEYC_Config(void)
{
	GPIO_InitTypeDef GPIO_Initstruct;
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIO_Initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Initstruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_Init(GPIOC,&GPIO_Initstruct);
}

u8 key_1=0,key_2=0,key_3=0,key_4=0,key_5=0,key_6=0,key_7=0,key_8=0;
u8 KEY_get(void)
{
	u8 key = 0xff;
	if(!KEY1 | !KEY2 | !KEY3 | !KEY4 | !KEY5 | !KEY6 | !KEY7)
	{
		Delay(1000);
		if(!KEY1) {key_1 = 1;key = 1;}
		if(!KEY2) {key_2 = 1;key = 2;}
		if(!KEY3) {key_3 = 1;key = 3;}
		if(!KEY4) {key_4 = 1;key = 4;}
		if(!KEY5) {key_5 = 1;key = 5;}
		if(!KEY6) {key_6 = 1;key = 6;}
		if(!KEY7) {key_7 = 1;key = 7;}
		if(!KEY8) {key_8 = 1;key = 8;}
	}
	return key;
}
